#include <stdio.h>
#include <fcntl.h> 
#include <unistd.h>
#include <termios.h> 
#include <stdlib.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#include "bmp.h"
#include "beep.h"
#include "lcd.h"
#include "led.h"
//6818串口所对应的文件名
#define COM2 "/dev/ttySAC1"
#define COM3 "/dev/ttySAC2"
#define COM4 "/dev/ttySAC3"


int data[5] = {0};

//定义命令--->设置模块的工作方式
unsigned char cmd1[3]={0xa5,0x81,0x26};//设置连续光照模式
unsigned char cmd2[3]={0xa5,0x82,0x27};//设置温湿度气压海拔模式

/* 设置串口参数（初始化串口） */
void init_tty(int fd)
{    
	//1.先有保存串口属性的结构体
    //声明设置串口的结构体
    struct termios termios_new;
    //先清空该结构体
    bzero(&termios_new, sizeof(termios_new));
    
    //2.激活选项
    //cfmakeraw()设置终端属性，就是设置termios结构中的各个参数。
    cfmakeraw(&termios_new);
    //CLOCAL和CREAD分别用于本地连接和接受使能，因此，首先要通过位掩码的方式激活这两个选项。    
    termios_new.c_cflag |= CLOCAL | CREAD;
    
    //3.设置波特率  一般地，用户需将终端的输入和输出波特率设置成一样的。
    //termios_new.c_cflag=(B9600);
    cfsetispeed(&termios_new, B9600);
    cfsetospeed(&termios_new, B9600);
    
    //4.设置字符大小,通过掩码设置数据位为8位
    //与设置波特率不同，设置字符大小并没有现成可用的函数，需要用位掩码。一般首先去除数据位中的位掩码，再重新按要求设置
    termios_new.c_cflag &= ~CSIZE;/* 用数据位掩码清空数据位设置 */
    termios_new.c_cflag |= CS8; 
    
    //5.设置无奇偶校验
    termios_new.c_cflag &= ~PARENB;
    
    //6.设置一位停止位
    termios_new.c_cflag &= ~CSTOPB;
    
    //7.设置最少字符和等待时间
   	//在对接收字符和等待时间没有特别要求的情况下，可以将其设置为0，则在任何情况下read()函数立即返回
	termios_new.c_cc[VTIME] = 10;
    termios_new.c_cc[VMIN] = 1;
    
    //8.用于清空输入/输出缓冲区
    tcflush (fd, TCIFLUSH);//对接收到而未被读取的数据进行清空处理
    
    //9.完成配置后，可以使用以下函数激活串口设置
    if(tcsetattr(fd,TCSANOW,&termios_new))//配置的修改立即生效
    	printf("Setting the serial1 failed!\n");
}

int Lux;
void GY_39()
{
    // 1.打开串口
    int tty = open(COM2,O_RDWR);
    if(tty == -1)
    {

    }
    // 2.初始化串口
    init_tty(tty);

    // 3.收发数据
    unsigned char buf[9] = {0};
  
    int res = write(tty,cmd1,3);  //先发送工作指令给模块
    if(res != 3)
    {
        sleep(1);   //等待完全写入
    }

    read(tty,buf,9);

    if(buf[0] == 0x5a && buf[1] == 0x5a && buf[2] == 0x15)
    {
        Lux = (buf[4] << 24)|(buf[5] << 16)|(buf[6] << 8)|buf[7];

    } 

    //温度湿度.....

    // 4.关闭文件
    close(tty);
}
void MQ_2()
{
    // 1.打开串口
    int tty = open(COM3,O_RDWR);
    if(tty == -1)
    {

    }
    // 2.初始化串口
    init_tty(tty);

    // 3.收发数据
    unsigned char buf[9] = {0};
    int Lux_mq;
    char mq_cmd[]={0xff,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
    int res = write(tty,mq_cmd,9);  //先发送工作指令给模块
    if(res != 3)
    {
        sleep(1);   //等待完全写入
    }

    read(tty,buf,9);

    // if(buf[0] == 0xff && buf[1] == 0x86)
    // {
    //     Lux_mq = (buf[2] << 8)|buf[3];
    //     display_sqare(20,20,16*3,24,0x0000);
    //     LCD_draw_num(Lux_mq);
    //     if(Lux<40)
    //     {
    //         LED_Ctrl(0,1,0);
    //         BEEP_Ctrl();
    //     }

    // } 

    //温度湿度.....

    // 4.关闭文件
    close(tty);
}

